import type {RouteLocationNormalized} from 'vue-router';
import {defineStore} from 'pinia';
import {DEFAULT_ROUTE, DEFAULT_ROUTE_NAME, REDIRECT_ROUTE_NAME,} from '@/router/constants';
import {isString} from '@/utils/is';
import {TabBarState, TagProps} from './types';

const formatTag = (route: RouteLocationNormalized): TagProps => {
    const {name, meta, fullPath, query} = route;
    return {
        title: meta.locale || '',
        name: String(name),
        fullPath,
        query,
        ignoreCache: meta.ignoreCache,
    };
};

const BAN_LIST = [REDIRECT_ROUTE_NAME];

const useAppStore = defineStore('tabBar', {
    state: (): TabBarState => ({
        cacheTabList: new Set([DEFAULT_ROUTE_NAME]),
        tagList: [DEFAULT_ROUTE],
    }),

    getters: {
        getTabList(): TagProps[] {
            return this.tagList;
        },
        getCacheList(): string[] {
            return Array.from(this.cacheTabList);
        },
    },

    actions: {
        updateTabList(route: RouteLocationNormalized) {
            if (BAN_LIST.includes(route.name as string)) return;
            this.tagList.push(formatTag(route));
            if (!route.meta.ignoreCache) {
                this.cacheTabList.add(route.name as string);
            }
        },
        deleteTag(idx: number, tag: TagProps) {
            this.tagList.splice(idx, 1);
            this.cacheTabList.delete(tag.name);
        },
        addCache(name: string) {
            if (isString(name) && name !== '') this.cacheTabList.add(name);
        },
        deleteCache(tag: TagProps) {
            this.cacheTabList.delete(tag.name);
        },
        freshTabList(tags: TagProps[]) {
            this.tagList = tags;
            this.cacheTabList.clear();
            // 要先判断ignoreCache
            this.tagList
                .filter((el) => !el.ignoreCache)
                .map((el) => el.name)
                .forEach((x) => this.cacheTabList.add(x));
        },
        resetTabList() {
            this.tagList = [DEFAULT_ROUTE];
            this.cacheTabList.clear();
            this.cacheTabList.add(DEFAULT_ROUTE_NAME);
        },
    },
});

export default useAppStore;
